package com.itheima.d3_annotation;

import org.junit.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/*
    目标：掌握注解的解析。

    AnnotatedElement接口提供了解析注解的方法
        public Annotation[] getDeclaredAnnotations()	获取当前对象上面的注解。
        public T getDeclaredAnnotation(Class<T> annotationClass)	获取指定的注解对象
        public boolean isAnnotationPresent(Class<Annotation> annotationClass)	判断当前对象上是否存在某个注解
 */
public class AnnotationTest3 {
    @Test
    public void parseClass() throws Exception {
        //解析注解
        //1.先获取class对象
        Class cls = ZhuJieDmeo.class;
        //2.根据对象获取方法
        Method method = cls.getDeclaredMethod("show");
        //获取到某个具体方法后判断是否存在注解
        boolean ap = method.isAnnotationPresent(ZhuJie3.class);
        System.out.println(ap);
        //如果存在注解，就获取注解属性
        if(ap){
            //获取指定的注解对象
            ZhuJie3 da = method.getDeclaredAnnotation(ZhuJie3.class);
            System.out.println(da.name());
            System.out.println(da.age());

        }


    }

    @Test
    public void parseMethod() throws Exception {
        //获取类的注解
        //创建对象
        Class cl = ZhuJieDmeo.class;
        //判断是否存在
        boolean a = cl.isAnnotationPresent(ZhuJie3.class);
        System.out.println(a);
        //如果存在
        if(a){
            //为什么要强转
            //因为不强转实际上是一个Annotection对象，相当于自定义注解的一个父接口，不知道自定义注解有什么具体的属性，所以要进行强转
           ZhuJie3 da = (ZhuJie3) cl.getDeclaredAnnotation(ZhuJie3.class);//传入注解类型，判断注解类型
            System.out.println(da.name());
            System.out.println(da.age());

        }


    }
}
